//题目:
// 你要开发一座金矿，地质勘测学家已经探明了这座金矿中的资源分布，并用大小为 m * n 的网格 grid 进行了标注。
// 每个单元格中的整数就表示这一单元格中的黄金数量；
// 如果该单元格是空的，那么就是 0。
// 为了使收益最大化，矿工需要按以下规则来开采黄金：
// 每当矿工进入一个单元，就会收集该单元格中的所有黄金。
// 矿工每次可以从当前位置向上下左右四个方向走。
// 每个单元格只能被开采（进入）一次。
// 不得开采（进入）黄金数目为 0 的单元格。
// 矿工可以从网格中 任意一个 有黄金的单元格出发或者是停止。
#include<iostream>
#include<vector>
#include<set>

using namespace std;
//代码:
class Solution 
{
    int count=0,ret=0;
    bool flag[15][15]={false};
    int arr_x[4]={-1,1,0,0},arr_y[4]={0,0,-1,1};
public:
    void dfs(vector<vector<int>>& grid,int row,int col)
    {
        bool lg=false;
        for(int i=0;i<4;i++)
        {
            int x=row+arr_x[i],y=col+arr_y[i];
            if(x>=0 && x<grid.size() && y>=0 && y<grid[0].size() && flag[x][y]==false && grid[x][y]!=0)
            {
                lg=true;
                flag[x][y]=true;
                count+=grid[x][y];
                dfs(grid,x,y);
                //回溯
                count-=grid[x][y];
                flag[x][y]=false;
            }   
        }
        if(lg==false)ret=max(ret,count);
    }
    int getMaximumGold(vector<vector<int>>& grid) 
    {
        for(int i=0;i<grid.size();i++)
        {
            for(int j=0;j<grid[i].size();j++)
            {
                if(grid[i][j]!=0)
                {
                    flag[i][j]=true;
                    count+=grid[i][j];
                    dfs(grid,i,j);
                    count-=grid[i][j];
                    flag[i][j]=false;//回溯
                }
            }
        }
        return ret;
    }
};